﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using vudu.EnlaceDatos.SqlServer;

namespace vudu.Logica.Clases
{
    /// <summary>
    /// Este caso de uno maneja toda la logica de Evaluacion - Grupo #1 para segunda entrega.
    /// </summary>
    public class Evaluacion
    {
        #region Atributos clase Evaluacion

        private int _idEvaluacion;
        private string _nombre;
        private string _tipoEvaluacion;
        private int _porcentaje;
        private DateTime _fechaEvaluacion;
        private List<Nota> _notasEvaluacion;
        private int _fkIdSeccion;
        private SqlServerEvaluacion sqlServerEvaluacion = new SqlServerEvaluacion();

        #endregion

        #region Constructor
        public Evaluacion()
        {
        }
        public Evaluacion(string nombre, string tipoEvaluacion, int porcentaje, DateTime fechaEvaluacion,int fkIdSeccion)
        {
            Nombre = nombre;
            TipoEvaluacion = tipoEvaluacion;
            Porcentaje = porcentaje;
            FechaEvaluacion = fechaEvaluacion;
            FkIdSeccion = fkIdSeccion;
        }
        #endregion

        #region Getters & Setters

        public string Nombre
        {
            get { return _nombre; }
            set { _nombre = value; }
        }

        public string TipoEvaluacion
        {
            get { return _tipoEvaluacion; }
            set { _tipoEvaluacion = value; }
        }

        public int Porcentaje
        {
            get { return _porcentaje; }
            set { _porcentaje = value; }
        }

        public DateTime FechaEvaluacion
        {
            get { return _fechaEvaluacion; }
            set { _fechaEvaluacion = value; }
        }

        public List<Nota> NotasEvaluacion
        {
            get { return _notasEvaluacion; }
            set { _notasEvaluacion = value; }
        }

        public int FkIdSeccion
        {
            get { return _fkIdSeccion; }
            set { _fkIdSeccion = value; }
        }

        public int IdEvaluacion
        {
            get { return _idEvaluacion; }
            set { _idEvaluacion = value; }
        }

        #endregion

        #region Metodos de evaluaciona
        /// <summary>
        /// Metodo que realiza una consulta para obtener las evaluaciones que tiene una seccion.
        /// </summary>
        /// <returns>
        /// Devuelve una lista con las Evaluaciones de la seccion.
        /// </returns>
        public List<Evaluacion> ConsultarEvaluacionPorSeccion()
        {
            throw new NotImplementedException();
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de un profesor, que no tengan cargadas notas.
        /// </summary>
        /// <param name="profesor">informacion del profesor que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con los esquemas de evaluacion del profesor, que no tengan notas cargadas.</returns>
        public List<SeccionMateria> ConsultarEsquemasDeEvaluacionSinNotasProfesor(Profesor profesor)
        {
            return sqlServerEvaluacion.ConsultarEsquemasDeEvaluacionSinNotasProfesor(profesor);
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de un profesor.
        /// </summary>
        /// <param name="profesor">informacion del profesor que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con los esquemas de evaluacion del profesor.</returns>
        public List<SeccionMateria> ConsultarEsquemasDeEvaluacionProfesor(Profesor profesor)
        {
            return sqlServerEvaluacion.ConsultarEsquemasDeEvaluacionProfesor(profesor);
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de una seccion.
        /// </summary>
        /// <param name="seccionMateria">informacion de la seccion que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con las evaluaciones de la seccion.</returns>
        public List<Evaluacion> ConsultarEsquemaEvaluacionSeccion(SeccionMateria seccionMateria)
        {
            return sqlServerEvaluacion.ConsultarEsquemaEvaluacionSeccion(seccionMateria);
        }

        /// <summary>
        /// Este metodo consulta en base de datos los esquemas de evaluacion de un estudiante.
        /// </summary>
        /// <param name="estudiante">informacion del estudiante que se le va a consultar los esquemas de evaluacion</param>
        /// <returns>Retorna una lista con los esquemas de evaluacion del estudiante.</returns>
        public List<SeccionMateria> ConsultarEsquemasEvaluacionEstudiante(Estudiante estudiante)
        {
            return sqlServerEvaluacion.ConsultarEsquemasEvaluacionEstudiante(estudiante);
        }

        /// <summary>
        /// Metodo que crea una nueva evaluacion.
        /// </summary>
        /// <returns>
        /// Devuelve el id de la Evaluacion creada.
        /// </returns>
        public int InsertarEvaluacion(Evaluacion evaluacion)
        {
            return sqlServerEvaluacion.InsertarEvaluacion(evaluacion);
        }

        /// <summary>
        /// Metodo que elimina un esquema de evaluacion.
        /// </summary>
        /// <returns>
        /// Devuelve un booleano indicando si la evaluacion fue o no eliminada.
        /// </returns>
        public bool EliminarEsquemaDeEvaluacion(SeccionMateria seccionMateria)
        {
            return sqlServerEvaluacion.EliminarEsquemaEvaluacion(seccionMateria);
        }

        /// <summary>
        /// Metodo que modifica una evaluacion.
        /// </summary>
        /// <returns>
        /// Devuelve un booleano indicando si la evaluacion fue o no modificada.
        /// </returns>
        public bool ModificarEvaluacion(Evaluacion evaluacion)
        {
            return sqlServerEvaluacion.ModificarEvaluacion(evaluacion);
        }

        /// <summary>
        /// Metodo que sirve para sobre escribir el metodo Equals de la clase evaluacion
        /// </summary>
        /// <param name="comparar">Objeto que se quiere comparar</param>
        /// <returns></returns>
        public override bool Equals(object comparar)
        {
            if (comparar == null) return false;

            if (ReferenceEquals(this, comparar)) return true;

            return (
                IdEvaluacion == (comparar as Evaluacion).IdEvaluacion &&
                Nombre == (comparar as Evaluacion).Nombre &&
                TipoEvaluacion == (comparar as Evaluacion).TipoEvaluacion &&
                Porcentaje == (comparar as Evaluacion).Porcentaje &&
                FechaEvaluacion == (comparar as Evaluacion).FechaEvaluacion &&
                FkIdSeccion == (comparar as Evaluacion).FkIdSeccion
                );
        }


        #endregion
    }
}